home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
tex
/
td187src.lzh
/
SELECTMO.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
57KB
|
1,721 lines
IMPLEMENTATION MODULE SelectModule;
(*
Letzte Änderung am 04/02/91: BringSelectionFront mit ...Back
ausgetauscht, da im weiteren bei Select im Punktmodus nunmehr
nicht mehr das erste sondern das letzte passende Objekt in der
Liste angewählt wird.
*)
IMPORT CommonData;
IMPORT mtAlerts;
IMPORT MagicAES;
IMPORT MagicSys;
IMPORT Variablen;
IMPORT MathLib0;
FROM Diverses IMPORT round, NumAlert, min, max;
FROM Types IMPORT ExtendedArraySize, ObjectPtrTyp, CodeAryTyp,
DrawObjectTyp, TextPosTyp;
FROM OwnBoxes IMPORT GetMKState, ChangeBox, SetMousePos,
MyGrafRubberBox, MyGrafDragBox;
FROM ObjectUtilities IMPORT ShowSelectRects, Redraw, ShowSelection;
FROM SYSTEM IMPORT ADR, ADDRESS;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
IMPORT Bezier, Circles, Epic, Lines, TextBox, Undo;
(**
IMPORT Debug;
IMPORT RTD;
**)
TYPE MoveCopyProc = PROCEDURE ( INTEGER, INTEGER );
ChangeProc = PROCEDURE ( ObjectPtrTyp,
LONGREAL, LONGREAL);
VAR ChangeProcedures : ARRAY DrawObjectTyp OF ChangeProc;
(* Sollen Dreh- oder Spiegel-Operationen intern aufgerufen werden,
so wird InternalFlag auf TRUE gesetzt. Damit wird dann ein
Redraw in den Subroutinen unterbunden... *)
InternalFlag : BOOLEAN;
AllObjects : BOOLEAN; (* Flag wird nur von ChangeAll gesetzt *)
PROCEDURE ChangePic(obj : ObjectPtrTyp;
dx, dy : LONGREAL);
VAR tmp : ObjectPtrTyp;
xo, yo : INTEGER;
BEGIN
xo := 0;
yo := 0;
tmp := obj^.Children;
WHILE tmp<>NIL DO
IF AllObjects OR (tmp^.Selected AND NOT tmp^.Locked) THEN
ChangeProcedures[VAL(DrawObjectTyp, tmp^.Code[0])](tmp, dx, dy);
(* Jetzt korrigiere Koordinaten *)
IF dx<>0.0 THEN
tmp^.Code[1] := xo + round(MathLib0.real(tmp^.Code[1] - xo) * dx);
tmp^.Surround[0] := xo + round(MathLib0.real(tmp^.Surround[0] - xo) * dx);
tmp^.Surround[2] := round(MathLib0.real(tmp^.Surround[2]) * dx);
END;
IF dy<>0.0 THEN
tmp^.Code[2] := yo + round(MathLib0.real(tmp^.Code[2] - yo) * dy);
tmp^.Surround[1] := yo + round(MathLib0.real(tmp^.Surround[1] - yo) * dy);
tmp^.Surround[3] := round(MathLib0.real(tmp^.Surround[3]) * dy);
END;
END;
tmp := tmp^.Next;
END;
IF dx<>0.0 THEN
obj^.Code[3] := round(MathLib0.real(obj^.Code[3]) * dx);
END;
IF dy<>0.0 THEN
obj^.Code[4] := round(MathLib0.real(obj^.Code[4]) * dy);
END;
obj^.SurrDirty := TRUE;
END ChangePic;
PROCEDURE ChangeIt(dx, dy : LONGREAL; xo, yo : INTEGER);
VAR tmp : ObjectPtrTyp;
BEGIN
tmp := Variablen.FirstObject^.Next;
WHILE tmp<>NIL DO
IF AllObjects OR (tmp^.Selected AND NOT tmp^.Locked) THEN
ChangeProcedures[VAL(DrawObjectTyp, tmp^.Code[0])](tmp, dx, dy);
(* Jetzt korrigiere Koordinaten *)
IF dx<>0.0 THEN
tmp^.Code[1] := xo + round(MathLib0.real(tmp^.Code[1] - xo) * dx);
tmp^.Surround[0] := xo + round(MathLib0.real(tmp^.Surround[0] - xo) * dx);
tmp^.Surround[2] := round(MathLib0.real(tmp^.Surround[2]) * dx);
END;
IF dy<>0.0 THEN
tmp^.Code[2] := yo + round(MathLib0.real(tmp^.Code[2] - yo) * dy);
tmp^.Surround[1] := yo + round(MathLib0.real(tmp^.Surround[1] - yo) * dy);
tmp^.Surround[3] := round(MathLib0.real(tmp^.Surround[3]) * dy);
END;
END;
tmp := tmp^.Next;
END;
END ChangeIt;
PROCEDURE ChangeAll(dx, dy : LONGREAL; xo, yo : INTEGER);
VAR tmp : ObjectPtrTyp;
BEGIN
AllObjects := TRUE;
ChangeIt(dx, dy, xo, yo);
AllObjects := FALSE;
END ChangeAll;
(* ---------------------------- *)
PROCEDURE SelObs (all : BOOLEAN) : CARDINAL;
VAR res : CARDINAL;
obj : ObjectPtrTyp;
BEGIN
res := 0;
obj := Variablen.FirstObject^.Next;
WHILE obj<>NIL DO
IF obj^.Selected THEN
IF all OR NOT obj^.Locked THEN
INC(res, 1);
END;
END;
obj := obj^.Next;
END;
RETURN res;
END SelObs;
(* ---------------------------- *)
PROCEDURE SelPics (all : BOOLEAN) : CARDINAL;
VAR res : CARDINAL;
obj : ObjectPtrTyp;
BEGIN
res := 0;
obj := Variablen.FirstObject^.Next;
WHILE obj<>NIL DO
IF obj^.Selected AND (ORD(obj^.Code[0])=ORD(Picture)) THEN
IF all OR NOT obj^.Locked THEN
INC(res, 1);
END;
END;
obj := obj^.Next;
END;
RETURN res;
END SelPics;
(* ---------------------------- *)
PROCEDURE DeleteSelection ;
(* neu geschrieben wegen Lock *)
VAR o1, o2 : ObjectPtrTyp;
BEGIN
IF SelObs(FALSE)>0 THEN
Undo.PrepareUndo(TRUE);
ChainOut(o1, TRUE);
o2 := o1;
WHILE o2<>NIL DO
o1 := o2^.Next;
Variablen.DeleteObject(o2);
o2 := o1;
END;
END;
END DeleteSelection;
(* ---------------------------- *)
PROCEDURE CopySelection(DX, DY : INTEGER);
VAR dx, dy : INTEGER;
obj : ObjectPtrTyp;
dum : INTEGER;
PROCEDURE CreateTreeCopy( source : ObjectPtrTyp;
VAR dest : ObjectPtrTyp);
VAR obj, destend, last : ObjectPtrTyp;
BEGIN
last := Variablen.LastObject;
destend := dest;
obj := source;
WHILE obj<>NIL DO
Variablen.NewObject(obj^.Code, obj^.CPtr, obj^.EPtr, obj^.Surround);
IF destend = NIL THEN
dest := Variablen.LastObject;
destend := Variablen.LastObject;
ELSE
destend^.Next := Variablen.LastObject;
destend := destend^.Next;
END;
IF (ORD(obj^.Code[0]) = ORD(Picture)) AND (obj^.Children<>NIL) THEN
CreateTreeCopy(obj^.Children, destend^.Children);
END;
obj := obj^.Next;
Variablen.LastObject := last;
Variablen.LastObject^.Next := NIL;
END;
END CreateTreeCopy;
BEGIN
IF (DX=0) AND (DY=0) THEN
(**
dum := Alert ( 2, Warning);
**)
dum := NumAlert ( 14, 2);
ELSE
dum := 1;
END;
IF dum=1 THEN
(*
Wir bedienen uns eines kleinen Tricks damit sich hinterher die
Selektion wieder am Ort der Maus befindet: Wir verschieben die
Selektion an die neue Stelle und erzeugen eine Kopie an der alten.
*)
dx := - DX;
dy := - DY;
MoveSelection(DX, DY);
obj := Variablen.FirstObject^.Next;
WHILE obj<>NIL DO
IF obj^.Selected THEN
Variablen.NewObject(obj^.Code, obj^.CPtr, obj^.EPtr, obj^.Surround);
Variablen.LastObject^.Code[1] := Variablen.LastObject^.Code[1] + dx;
Variablen.LastObject^.Code[2] := Variablen.LastObject^.Code[2] + dy;
Variablen.LastObject^.Surround[0] := Variablen.LastObject^.Surround[0] + dx;
Variablen.LastObject^.Surround[1] := Variablen.LastObject^.Surround[1] + dy;
(* Jetzt der Sonderfall eines Subpictures *)
IF (ORD(obj^.Code[0]) = ORD(Picture)) AND (obj^.Children<>NIL) THEN
CreateTreeCopy(obj^.Children, Variablen.LastObject^.Children);
END;
END;
obj := obj^.Next;
END;
END;
END CopySelection;
(* ---------------------------- *)
PROCEDURE MoveSelection(dx, dy : INTEGER);
PROCEDURE MoveEm(Start : ObjectPtrTyp;
dx, dy : INTEGER;
Change : BOOLEAN);
VAR obj : ObjectPtrTyp;
BEGIN
obj := Start;
WHILE obj<>NIL DO
IF obj^.Selected AND NOT obj^.Locked THEN
IF Change THEN
obj^.Code[1] := obj^.Code[1] + dx;
obj^.Code[2] := obj^.Code[2] + dy;
END;
obj^.Surround[0] := obj^.Surround[0] + dx;
obj^.Surround[1] := obj^.Surround[1] + dy;
(**
obj^.SurrDirty := TRUE;
**)
IF ORD(obj^.Code[0]) = ORD(Picture) THEN
MoveEm(obj^.Children, dx, dy, FALSE);
END;
END;
obj := obj^.Next;
END;
END MoveEm;
BEGIN
MoveEm(Variablen.FirstObject^.Next, dx, dy, TRUE);
END MoveSelection;
(* ---------------------------- *)
PROCEDURE DeselectT